home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / What's New? / Software Development Kits / Mac OS USB DDK / MacOS USB DDK 1.0b4 / NeptuneDDK / Examples / MouseModule / HIDEmulation.c next >
Encoding:
C/C++ Source or Header  |  1998-06-26  |  4.8 KB  |  184 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        HIDEmulation.c
  3.  
  4.     Contains:    HID Emulation glue code between the ADB SHIM and the USB Mouse HID Module
  5.  
  6.     Version:    xxx put version here xxx
  7.  
  8.     Copyright:    © 1998 by Apple Computer, Inc., all rights reserved.
  9.  
  10. */
  11.  
  12. #include <Types.h>
  13. #include <Devices.h>
  14. #include <DriverServices.h>
  15. #include <CursorDevices.h>
  16. #include <USB.h>
  17.  
  18.  
  19. #include "MouseModule.h"
  20.  
  21. extern    usbMousePBStruct myMousePB;
  22.  
  23. void USBMouseIn(UInt8 theDeviceClass, void * theData)
  24. {
  25. #pragma unused (theDeviceClass)
  26.  
  27. USBHIDDataPtr    pMouseData;
  28. static UInt16     oldbuttons = 0;
  29. UInt16     changedbuttons = 0;
  30.  
  31. //    DebugStr("\pIn USBMouseIn");
  32.     pMouseData = (USBHIDDataPtr)theData;
  33.  
  34.     if (myMousePB.pCursorDeviceInfo == 0)
  35.     {
  36. //        DebugStr("\pSetting up cursor device manager");
  37.         myMousePB.pCursorDeviceInfo = &myMousePB.cursorDeviceInfo;
  38.         CursorDeviceNewDevice(&myMousePB.pCursorDeviceInfo);
  39.         
  40.         CursorDeviceSetAcceleration(myMousePB.pCursorDeviceInfo, (Fixed)(1<<16));
  41.         
  42.         CursorDeviceSetButtons(myMousePB.pCursorDeviceInfo, 3);    // should actually be set by reading
  43.                                                                         // the HID descriptor, but lacking
  44.                                                                         // a parser, we'll just force it
  45.                                                                         // this way.
  46.         CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 0, kButtonSingleClick, 0L);
  47.         CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 1, kButtonSingleClick, 0L);
  48.         CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 2, kButtonSingleClick, 0L);
  49.         CursorDeviceUnitsPerInch(myMousePB.pCursorDeviceInfo, (Fixed)(myMousePB.unitsPerInch));
  50.     }
  51.     // Tell the Cursor Device Manager that we moved
  52.     if ((pMouseData->mouse.XDelta != 0) || (pMouseData->mouse.YDelta !=0))
  53.     {
  54.         CursorDeviceMove(myMousePB.pCursorDeviceInfo, pMouseData->mouse.XDelta, pMouseData->mouse.YDelta);
  55.     }
  56.     
  57.     // Update with the state of the buttons.
  58.     pMouseData->mouse.buttons &= 0x07;
  59.     changedbuttons = oldbuttons ^ pMouseData->mouse.buttons;
  60.     if (changedbuttons)
  61.     {
  62.         CursorDeviceButtons(myMousePB.pCursorDeviceInfo, (short)pMouseData->mouse.buttons);
  63.     }
  64.     oldbuttons = pMouseData->mouse.buttons;
  65. }
  66.  
  67. OSStatus USBHIDInstallInterrupt(HIDInterruptProcPtr HIDInterruptFunction)
  68. {
  69.     USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Disabled (interrupt service routine installed)", myMousePB.deviceRef);
  70.     myMousePB.pSHIMInterruptRoutine = HIDInterruptFunction;
  71.     return noErr;
  72. }
  73.  
  74. OSStatus USBHIDPollDevice(void)
  75. {
  76.     return kUSBInternalErr;
  77. }
  78.  
  79. OSStatus USBHIDControlDevice(UInt32 theControlSelector, void * theControlData)
  80. {
  81. #pragma unused (theControlData)
  82.  
  83.     switch (theControlSelector)
  84.     {
  85.         case kHIDRemoveInterruptHandler:
  86.             myMousePB.pSavedInterruptRoutine = nil;
  87.             myMousePB.pSHIMInterruptRoutine = nil;
  88.             break;
  89.             
  90.         case kHIDEnableDemoMode:
  91.             USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Enabled", myMousePB.deviceRef);
  92.             myMousePB.pSavedInterruptRoutine = myMousePB.pSHIMInterruptRoutine;
  93.             myMousePB.pSHIMInterruptRoutine = USBMouseIn;
  94.             break;
  95.  
  96.  
  97.         case kHIDDisableDemoMode:
  98.             USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Disabled", myMousePB.deviceRef);
  99.             myMousePB.pSHIMInterruptRoutine = myMousePB.pSavedInterruptRoutine;
  100.             break;
  101.  
  102.         default:
  103.             return paramErr;
  104.     }
  105.     return noErr;
  106. }
  107.  
  108.  
  109.  
  110. OSStatus USBHIDGetDeviceInfo(UInt32 theInfoSelector, void * theInfo)
  111. {
  112. HIDInterruptProcPtr * pHIDIntProcPtr;
  113. UInt32 * pUnits;
  114.  
  115.     switch (theInfoSelector)
  116.     {
  117.         case kHIDGetDeviceUnitsPerInch:
  118.             pUnits = (UInt32*)theInfo;
  119.             *pUnits = (UInt32)(myMousePB.unitsPerInch);
  120.             break;
  121.             
  122.             
  123.         case kHIDGetInterruptHandler:
  124.             pHIDIntProcPtr = (HIDInterruptProcPtr *)theInfo;     
  125.             *pHIDIntProcPtr = myMousePB.pSHIMInterruptRoutine;
  126.             break;
  127.  
  128.         default:
  129.             return paramErr;
  130.     }
  131.     return noErr;
  132. }
  133.  
  134. OSStatus USBHIDEnterPolledMode(void)
  135. {
  136.     return unimpErr;
  137. }
  138.  
  139. OSStatus USBHIDExitPolledMode(void)
  140. {
  141.     return unimpErr;
  142. }
  143.  
  144. OSStatus USBHIDGetHIDDescriptor(USBHIDDescriptorPtr *hHIDDescriptor)
  145. {
  146. #pragma unused (hHIDDescriptor)
  147.     return unimpErr;
  148. }
  149.  
  150. void NotifyRegisteredHIDUser(UInt32 devicetype, UInt8 hidReport[])
  151. {
  152. #pragma unused (devicetype)
  153.  
  154. USBHIDData        theMouseData;
  155. SInt8            myXDelta, myYDelta;
  156.  
  157.     theMouseData.mouse.buttons = (UInt16)hidReport[0];
  158.     
  159.     myXDelta = (SInt8)hidReport[1];
  160.     myYDelta = (SInt8)hidReport[2];  
  161.     
  162.     theMouseData.mouse.XDelta = (SInt16)myXDelta;
  163.     theMouseData.mouse.YDelta = (SInt16)myYDelta;
  164.     if (myMousePB.pSHIMInterruptRoutine)
  165.     {
  166.         (*myMousePB.pSHIMInterruptRoutine)(kHIDMouseInterfaceProtocol, (void *)&theMouseData);
  167.     }
  168. }
  169.  
  170. USBHIDModuleDispatchTable TheHIDModuleDispatchTable =
  171. {
  172.     (USBHIDInstallInterruptProcPtr)USBHIDInstallInterrupt,
  173.     (USBHIDPollDeviceProcPtr)USBHIDPollDevice,
  174.     (USBHIDControlDeviceProcPtr)USBHIDControlDevice,
  175.     (USBHIDGetDeviceInfoProcPtr)USBHIDGetDeviceInfo,
  176.     (USBHIDEnterPolledModeProcPtr)USBHIDEnterPolledMode,
  177.     (USBHIDExitPolledModeProcPtr)USBHIDExitPolledMode,  
  178.     (USBHIDGetHIDDescriptorProcPtr)USBHIDGetHIDDescriptor
  179. };
  180.  
  181. CursorDevicePtr gUSBMouse;
  182. CursorDevice    ourDevice;
  183.  
  184.